package com.y3k.servlet;

import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.log4j.Logger;
import java.util.List;
import java.util.Iterator;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * Servlet para subir archivos desde el cliente. Originalmente usado para subir el archivo de licencia license.dat
 */
public class UploadFileServlet extends HttpServlet{
	
	public static final Logger log = Logger.getLogger(UploadFileServlet.class);

	private static final long serialVersionUID = 1L;
	
	private String FILE_PATH = "/WEB-INF/classes/resources/license/license.dat";	
	
	public void doGet(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException {
		doPost(request, res);
	}
	
	@SuppressWarnings("unchecked")
	public void doPost(HttpServletRequest request, HttpServletResponse res) throws ServletException, IOException {
		// Crear un factory para disk-based file items
		FileItemFactory factory = new DiskFileItemFactory();
		// Crear un nuevo file upload handler
		ServletFileUpload upload = new ServletFileUpload(factory);
		
		// Hacer portable el path, segun el separador usado en cada SO
		FILE_PATH.replace('/', File.separatorChar);
		// Full path al archivo a subir
		String completePath = this.getServletContext().getRealPath(new String(FILE_PATH));
				
		
/*		//TODO  reemplazar los %20 en windows por espacio
		// Si el sistema operativo del server es windows, reemplazar los %20 por espacios para que no falle en la localizacion de los archivos
		if (System.getProperty("os.name").contains("Windows")){
			completePath = completePath.replaceAll("%20", " ");
		}*/		
			
		try{
			// Parsear el request
			List <FileItem> items = upload.parseRequest(request);
			// Procesar los items a subir
			Iterator iter = items.iterator();
			
			while (iter.hasNext()) {
			   FileItem item = (FileItem) iter.next();
				   
			   if(!item.isFormField()){
				   
				  // Renombrar el archivo de licencia anterior. Se lo guarda como backup. 
				  File oldF = new File(completePath);
				  if (oldF.exists()){					  
					  File fAux = new File(completePath + "." + System.currentTimeMillis());
					  oldF.renameTo(fAux);
				  }				   
				   
				  // Hacer el upload del nuevo archivo de licencia
			      byte[] data = item.get();
			      FileOutputStream fileOutSt = new FileOutputStream(new File(completePath));
			      fileOutSt.write(data);
			      fileOutSt.close();
			   }
			}
		}
		catch(FileUploadException e){
			e.printStackTrace();
		}
	}	
}